package com.example.jsoup.kuang.question.utils;

import com.alibaba.fastjson.JSON;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by HMF on 2021/10/14 23:22
 */
public class NeedDetailUtil {

    public static void main(String[] args) throws Exception {
        Map<String, String> idAndUrl = new HashMap<>();
        idAndUrl.put("id", "2047");
        idAndUrl.put("url", "/needs/detail?id=2047");

        Map<String, String> talentNeedDetail = NeedDetailUtil.getTalentNeedDetail(idAndUrl);

        String s = JSON.toJSON(talentNeedDetail).toString();
        System.out.println("\n人才需求详细页爬取的数据详情json：：：：\n" + s);

    }

    /**
     * @param idAndUrl
     * @param type     【(技术需求详情 type=1)、（服务需求详情 type=2)】
     * @return 返回页面的信息数据，通过 key 值取出来
     * @throws Exception
     */
    public static Map<String, String> getTechnologyAndServiceNeedDetail(Map<String, String> idAndUrl, int type) throws Exception {

        Map<String, String> pageDataMap = new HashMap<>();

        // 直接添加原id original_id 和 type 到 返回的 Map 中
        pageDataMap.put("original_id", idAndUrl.get("id"));
        pageDataMap.put("type", type + "");

        // 联系人 和 联系电话 没有数据可爬取，在这里也直接设置
        pageDataMap.put("contacts_member", "");
        pageDataMap.put("contacts_mobile", "");

//        int type = 0;  // 直接从入参中传入

        // 需要爬取并且入库的内容 title、base、msg
        // title
        String need_name = ""; // 需求名称
        String send_time = ""; // 发布时间
        String source = ""; // 来源
        String money = ""; // 预算
        int money_flag = 0; // 是否双方协商  0：否、1：是

        // base
        String industry_category = ""; // 行业分类
        String area = ""; // 地区
        String demand_side = ""; // 需求方

        // msg
        // type = 1
        String background_content = ""; // 需求背景
        String problem_content = ""; // 需解决的主要技术难题
        String goal_content = ""; // 拟实现的主要技术目标/具体指标

        // type = 2
        String describe_content = ""; // 需求描述


        // 请求的页面地址
        String url = "https://www.kczg.org.cn" + idAndUrl.get("url");

        // 解析返回的html页面，生成 Document 对象
        Document document = Jsoup.parse(new URL(url), 5000);


        // 需要爬取内容的外层 div
        Element parent_div = document.getElementsByClass("detail-con").first();

        /**
         * title标题 div
         */
        Element div_title = parent_div.getElementsByClass("title").first();

        // 需求名称
        need_name = div_title.getElementsByClass("title-label").text();
        pageDataMap.put("need_name", need_name);

        // 发布时间
        send_time = div_title.getElementsByClass("fl").get(0).text().split(":")[1].trim();
        pageDataMap.put("send_time", send_time);

        // 来源
        source = div_title.getElementsByClass("fl").get(1).text().split(":")[1].trim();
        pageDataMap.put("source", source);

        // 预算
//        money = div_title.getElementsByClass("money").first().getElementsByTag("span").text().replace("万", "");
//        money = div_title.getElementsByClass("money").first().getElementsByTag("span").text();
//        money = div_title.getElementsByClass("money").first().getElementsByTag("span").text().split("万")[0];

        String money_text = div_title.getElementsByClass("money").first().getElementsByTag("span").text().trim();

        if (money_text.equals("双方协商")) {
            money = "";
            money_flag = 1;

            pageDataMap.put("money", money);
            pageDataMap.put("money_flag", money_flag + "");

        } else { // 说明有 万 字
            String[] str = money_text.split("万");
            money = str[0]; // 取前面的 数字 ，如原来是 500万，这里就取了 500
            money_flag = 0;

            pageDataMap.put("money", money);
            pageDataMap.put("money_flag", money_flag + "");
        }

        /**
         * base基本信息base div
         */
        Element div_base = parent_div.getElementsByClass("base").first();

        Elements p_list = div_base.getElementsByClass("base-detail").first().getElementsByTag("p");

        industry_category = p_list.get(0).getElementsByTag("span").text();
        area = p_list.get(1).getElementsByTag("span").text();
        demand_side = p_list.get(2).getElementsByTag("span").text();

        pageDataMap.put("industry_category", industry_category);
        pageDataMap.put("area", area);
        pageDataMap.put("demand_side", demand_side);

        /**
         * msg详细信息 div_msg 列表
         */
        Elements div_msg_list = parent_div.getElementsByClass("msg");

        // 技术需求详情 type=1
        // 服务需求详情 type=2
        if (type == 1) {
            String backgroundTitle = "需求背景";
            String problemTitle = "需解决的主要技术难题";
            String goalTitle = "拟实现的主要技术目标/具体指标";

            for (int i = 0; i < div_msg_list.size(); i++) {
                String msg_html = div_msg_list.get(i).html();
                String contentTitle = div_msg_list.get(i).getElementsByClass("msg-label").text();

                // 通过判断知道具体少了哪一项，并存储到对应的字段中
                if (contentTitle.equals(backgroundTitle)) {
                    background_content = msg_html;
                } else if (contentTitle.equals(problemTitle)) {
                    problem_content = msg_html;
                } else if (contentTitle.equals(goalTitle)) {
                    goal_content = msg_html;
                } else {
                    // 不处理
                }
            }

        } else if (type == 2) {
            describe_content = div_msg_list.get(0).html();

        } else {
            // 不处理
            return null;
        }

        pageDataMap.put("background_content", background_content);
        pageDataMap.put("problem_content", problem_content);
        pageDataMap.put("goal_content", goal_content);

        pageDataMap.put("describe_content", describe_content);

        return pageDataMap;
    }


    /**
     * 人才需求，因为页面的结构不同，所以要另外起一个方法
     *
     * @param idAndUrl
     */
    public static Map<String, String> getTalentNeedDetail(Map<String, String> idAndUrl) throws Exception {

        Map<String, String> pageDataMap = new HashMap<>();

        // 直接添加原id original_id 到 返回的 Map 中
        pageDataMap.put("original_id", idAndUrl.get("id"));

        // 联系人 和 联系电话 没有数据可爬取，在这里也直接设置
        pageDataMap.put("contacts_member", "");
        pageDataMap.put("contacts_mobile", "");

        String need_name = "";  // 职位需求名称
        String send_time = "";  // 发布时间
        String money = ""; // 预算
        int pay_type = 1; // 默认为 1，按月支付，双方协商也是为 1

        String area = ""; // 地区
        String experience = "";  // 工作经验
        String degree = ""; // 个人学历
        String direction = ""; // 研究方向
        String industry_category = ""; // 行业领域

        String describe_content = ""; // 需求描述

        // 请求的页面地址
        String url = "https://www.kczg.org.cn" + idAndUrl.get("url");

        // 解析返回的html页面，生成 Document 对象
        Document document = Jsoup.parse(new URL(url), 5000);

        // 需要爬取内容的外层 div
        Element parent_div = document.getElementsByClass("detail-con").first();

        /**
         * title div 层
         */
        Element div_title = parent_div.getElementsByClass("title").first();

        // 职位需求名称
        need_name = div_title.getElementsByClass("title-label").text().trim();
        pageDataMap.put("need_name", need_name);

        // 发布时间
        send_time = div_title.getElementsByClass("time").text().split(":")[1].trim() + " 00:00:00";
        pageDataMap.put("send_time", send_time);

        // 预算
        String money_text = div_title.getElementsByClass("money").first().text().trim();
        System.out.println("\nmoney_text:::::\n" + money_text);

        // 判断是否有 年 字，即可，以为其他情况都为 1
        if (money_text.contains("年")) { // 字符串有 年 字
            pay_type = 2;
        } else {
            pay_type = 1;
        }
        pageDataMap.put("pay_type", pay_type + "");

        money = div_title.getElementsByClass("mr").first().text().trim();


        /**
         * base div 层
         */
        Element div_base = parent_div.getElementsByClass("base").first();

        //
        String p_text = div_base.getElementsByClass("base-detail").first().getElementsByTag("p").text();

        String[] p_text_list = p_text.split("\\|");  // 这里的正则表达式有点意思

        area = p_text_list[0].trim();
        pageDataMap.put("area", area);

        experience = p_text_list[1].trim();
        pageDataMap.put("experience", experience);

        degree = p_text_list[2].trim();
        pageDataMap.put("degree", degree);

        direction = p_text_list[3].trim();
        pageDataMap.put("direction", direction);

        industry_category = p_text_list[4].trim();
        pageDataMap.put("industry_category", industry_category);

        /**
         * msg div 层
         */
        Element div_msg = parent_div.getElementsByClass("msg").first();

        describe_content = div_msg.html();
        pageDataMap.put("describe_content", describe_content);

        return pageDataMap;
    }
}
















